package com.quanxiaoha.weblog.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;

/**
 * 积分利息计算工具类
 */
public class PointsInterestCalculator {
    
    // 默认半小时利率（2%）
    private static final BigDecimal DEFAULT_HALF_HOUR_RATE = new BigDecimal("0.02");
    
    /**
     * 计算积分利息
     * @param principal 本金（积分）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 应还积分（本金+利息）
     */
    public static BigDecimal calculateInterest(BigDecimal principal, LocalDateTime startTime, LocalDateTime endTime) {
        if (principal == null || startTime == null || endTime == null) {
            throw new IllegalArgumentException("参数不能为空");
        }
        
        if (principal.compareTo(BigDecimal.ZERO) <= 0) {
            return principal;
        }
        
        // 计算半小时数
        long minutes = ChronoUnit.MINUTES.between(startTime, endTime);
        long halfHours = minutes / 30;
        if (halfHours <= 0) {
            return principal;
        }
        
        // 计算复利
        BigDecimal interest = principal.multiply(
                BigDecimal.ONE.add(DEFAULT_HALF_HOUR_RATE).pow((int) halfHours)
        ).subtract(principal);
        
        // 四舍五入到整数
        return principal.add(interest).setScale(0, RoundingMode.HALF_UP);
    }
    
    /**
     * 使用自定义半小时利率计算积分利息
     * @param principal 本金（积分）
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param halfHourRate 半小时利率（例如：0.02 表示 2%）
     * @return 应还积分（本金+利息）
     */
    public static BigDecimal calculateInterest(BigDecimal principal, LocalDateTime startTime, 
            LocalDateTime endTime, BigDecimal halfHourRate) {
        if (halfHourRate == null || halfHourRate.compareTo(BigDecimal.ZERO) <= 0) {
            throw new IllegalArgumentException("半小时利率必须大于0");
        }
        
        // 计算半小时数
        long minutes = ChronoUnit.MINUTES.between(startTime, endTime);
        long halfHours = minutes / 30;
        if (halfHours <= 0) {
            return principal;
        }
        
        // 计算复利
        BigDecimal interest = principal.multiply(
                BigDecimal.ONE.add(halfHourRate).pow((int) halfHours)
        ).subtract(principal);
        
        // 四舍五入到整数
        return principal.add(interest).setScale(0, RoundingMode.HALF_UP);
    }
} 